﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ServisniList.Core;
using ServisniList.Rukovatelji;

namespace ServisniList
{
    public partial class ServisniListUnos : Form
    {

        #region  Fields

        private bool adminMode = false;
        private bool izlazIzAplikacije = true;
        private Core.List trenutniList = null;
        private AutoCompleteStringCollection strankaDpounjavanje = new AutoCompleteStringCollection();
        private AutoCompleteStringCollection strankaOIBDpounjavanje = new AutoCompleteStringCollection();
        private AutoCompleteStringCollection materijaliDpounjavanje = new AutoCompleteStringCollection();
        private DataModelDataContext context = null;
        private List<CheckBox> listaKontrolaZaOpisRada = new List<CheckBox>();

        #endregion

        #region Constructor

        public ServisniListUnos()
        {
            InitializeComponent();
            context = new DataModelDataContext(ConfigurationManager.ConnectionStrings["ServisniListConnectionString"].ConnectionString);
            generirajKontroleZaOdabirOpisaProblema();
            this.dgUtrosenMaterijal.EnterEvent += dgUtrosenMaterijal_EnterEvent;
            this.mnuUredjivanje.Visible = this.adminMode = Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.Administrator;
            izlazIzAplikacije = true;
            postaviPodatkeZaNoviLsit();
        }

        #endregion

        #region Event handlers

        private void btnKreirajList_Click(object sender, EventArgs e)
        {
            if (validacijaZaKreiranjeLista())
            {
                Core.Stranka stranka = (from item in context.Strankas where item.Naziv == txtStranka.Text select item).FirstOrDefault();
                if (stranka == null)
                {
                    stranka = new Core.Stranka();
                    stranka.Naziv = txtStranka.Text;
                    stranka.OIB = txtStrankaOIB.Text;
                    stranka.Adresa = txtAdresaStranke.Text;
                    stranka.BrojTelefona = txtTelefonStranke.Text;
                    stranka.BrojMobitela = txtMobitelStranke.Text;
                    stranka.Email = txtEmailStranke.Text;
                }
                else
                {
                    stranka.OIB = txtStrankaOIB.Text;
                    stranka.Adresa = txtAdresaStranke.Text;
                    stranka.BrojTelefona = txtTelefonStranke.Text;
                    stranka.BrojMobitela = txtMobitelStranke.Text;
                    stranka.Email = txtEmailStranke.Text;
                }

                trenutniList.OpisProblema = txtOpisOdabarnogOpisProblema.Text;


                foreach (var item in listaKontrolaZaOpisRada)
                {
                    if (item.Checked)
                    {
                        ListOpisProblemaStavka opisProblemStavka = new ListOpisProblemaStavka();
                        opisProblemStavka.List = trenutniList;
                        opisProblemStavka.OpisProblemaID = (long)item.Tag;
                        trenutniList.Stranka = stranka;
                        trenutniList.ZaprimljenoUPnp = rbUPnp.Checked; 
                    }
                }
                
                context.Lists.InsertOnSubmit(trenutniList);
                context.SubmitChanges();
                
                omoguciKontroleZatvaranjaListica(true);
                omoguciKontroleOtvaranjaListica(false);
                omoguciExport(true);

                trenutniList.ServiserID = trenutniList.ZaprimateljID;
                lblServiserOdradio.Text = Korisnici.GeneriajPrikazKorisnika(trenutniList.Serviser);

                openFile(exportUPdf());
            }


        }

        private void ServisniListUnos_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (context != null)
            {
                context.Dispose();
            }
        }

        private void ServisniListUnos_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (izlazIzAplikacije)
            {
                Application.Exit();
            }
        }

        private void txtStranka_Leave(object sender, EventArgs e)
        {
            string txtStrankaIme = ((TextBox)sender).Text;
            Core.Stranka stranka = (from item in context.Strankas where item.Naziv == txtStrankaIme select item).FirstOrDefault();
            if (stranka != null)
            {
                txtStrankaOIB.Text = stranka.OIB;
                txtAdresaStranke.Text = stranka.Adresa;
                txtTelefonStranke.Text = stranka.BrojTelefona;
                txtMobitelStranke.Text = stranka.BrojMobitela;
                txtEmailStranke.Text = stranka.Email;
            }
            else
            {
                txtStrankaOIB.Text = "";
                txtAdresaStranke.Text = "";
                txtTelefonStranke.Text = "";
                txtMobitelStranke.Text = "";
                txtEmailStranke.Text = "";
            }
        }

        private void txt_TextChanged(object sender, EventArgs e)
        {
            errNotifikacijaValidacije.SetError((TextBox)sender, null);
        }

        private void btnZatvori_Click(object sender, EventArgs e)
        {
            if (validacijaZatvaranjaLista())
            {
                trenutniList.UtrosenoVrijemeRada = int.Parse(mtxtUtrosenoSatiRada.Text);
                trenutniList.DatumZatvaranja = DateTime.Now;
                trenutniList.ServiserID = Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.ID;

                trenutniList.OpisRada = txtOpisRada.Text;
                trenutniList.OpisRadaRadUServisu = rbOpisUServisu.Checked;

                var odabraniMaterijali = (from item in ((List<OdabraniUtrosenMaterijalStavkaVizual>)utrosenMaterijalBS.DataSource)
                                          select new ListMaterijalStavka()
                                          {
                                              BrojList = trenutniList.BrojLista,
                                              Materijal = item.MaterijalRef,
                                              Komada = item.Komada
                                          }
                        ).ToList();

                context.ListMaterijalStavkas.InsertAllOnSubmit(odabraniMaterijali);
                context.SubmitChanges();

                omoguciKontroleZatvaranjaListica(false);
                btnDodajPodatkeZaIsporuku.Enabled = true;
            }
        }

        private void btnDodajPodatkeZaIsporuku_Click(object sender, EventArgs e)
        {
            ServisniListIsporuka sIsporuka = new ServisniListIsporuka(context, trenutniList);
            sIsporuka.ShowDialog();
        }

        private void btnDodajOpisRada_Click(object sender, EventArgs e)
        {
            OpisRadaServiserOdabir opisradaserviserodabir = new OpisRadaServiserOdabir();
            opisradaserviserodabir.ShowDialog();
            string odabarniOpisiRada = opisradaserviserodabir.Odabir;
            txtOpisRada.Text += odabarniOpisiRada;
        }

        private void txtMaterijalUnos_Leave(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtUtrosenMaterijalUnos.Text))
            {
                string txtNazivMaterijala = ((TextBox)sender).Text;
                Core.Materijal materijal = (from item in context.Materijals where item.Naziv == txtNazivMaterijala select item).FirstOrDefault();
                if (materijal == null)
                    materijal = new Materijal() { Naziv = txtNazivMaterijala };
                var listaMaterijala = ((List<Core.OdabraniUtrosenMaterijalStavkaVizual>)utrosenMaterijalBS.DataSource).ToList();
                listaMaterijala.Add
                (
                    new ServisniList.Core.OdabraniUtrosenMaterijalStavkaVizual()
                    {
                        Materijal = materijal.Naziv,
                        MaterijalRef = materijal,
                        BrojList = trenutniList.BrojLista,
                        Komada = ((int)cbUtrosenMaterijalBrojKomada.SelectedItem)
                    }
                );
                utrosenMaterijalBS.DataSource = listaMaterijala;
                txtUtrosenMaterijalUnos.Text = "";
            }
        }

        private void dgUtrosenMaterijal_DoubleClick(object sender, EventArgs e)
        {
            DataGridView grid = ((DataGridView)sender);
            if (grid.RowCount > 0)
            {
                OdabraniUtrosenMaterijalStavkaVizual odabraniRed = ((OdabraniUtrosenMaterijalStavkaVizual)grid.SelectedRows[0].DataBoundItem);

                if (odabraniRed != null)
                {
                    var listaMaterijala = ((List<Core.OdabraniUtrosenMaterijalStavkaVizual>)utrosenMaterijalBS.DataSource).ToList();
                    listaMaterijala.Remove(odabraniRed);
                    utrosenMaterijalBS.DataSource = listaMaterijala;
                }
            }
        }

        private void dgUtrosenMaterijal_EnterEvent(object sender, EventArgs e)
        {
            DataGridView grid = ((DataGridView)sender);
            if (grid.RowCount > 0)
            {
                OdabraniUtrosenMaterijalStavkaVizual odabraniRed = ((OdabraniUtrosenMaterijalStavkaVizual)grid.SelectedRows[0].DataBoundItem);

                if (odabraniRed != null)
                {
                    var listaMaterijala = ((List<Core.OdabraniUtrosenMaterijalStavkaVizual>)utrosenMaterijalBS.DataSource).ToList();
                    listaMaterijala.Remove(odabraniRed);
                    utrosenMaterijalBS.DataSource = listaMaterijala;
                }
            }
        }

        #endregion

        #region Menu event handlers

        private void mnuDjelatnici_Click(object sender, EventArgs e)
        {
            Djelatnici djelatniciForma = new Djelatnici();
            djelatniciForma.ShowDialog();
        }

        private void mnuPretraga_Click(object sender, EventArgs e)
        {
            ServisniListPretraga pretragaServisnihListova = new ServisniListPretraga();
            pretragaServisnihListova.ShowDialog();

            if (pretragaServisnihListova.OdabraniServisniListBbroj != null)
            {
                trenutniList = context.Lists.Where(clan => clan.BrojLista == pretragaServisnihListova.OdabraniServisniListBbroj).FirstOrDefault();
                ubaciPostojeciList(trenutniList);
            }
        }

        private void mnuOdlogirajSe_Click(object sender, EventArgs e)
        {
            izlazIzAplikacije = false;
            UlaznaForma ulazOpet = new UlaznaForma();
            Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik = null;
            ulazOpet.Show();
            this.Close();
        }

        private void mnuOpisiRada_Click(object sender, EventArgs e)
        {
            OpisRada opis = new OpisRada();
            opis.ShowDialog();
        }

        private void mnuStranke_Click(object sender, EventArgs e)
        {
            Stranke stranke = new Stranke();
            stranke.ShowDialog();
        }

        private void mnuMaterijali_Click(object sender, EventArgs e)
        {
            Materijali materijali = new Materijali();
            materijali.ShowDialog();
        }

        private void mnuUExcel_Click(object sender, EventArgs e)
        {
            exportUExcel();
        }

        private void mnuUPdf_Click(object sender, EventArgs e)
        {
            exportUPdf();
        }

        private void mnuNoviNalog_Click(object sender, EventArgs e)
        {
            postaviPodatkeZaNoviLsit();
        }

        private void oAplikacijiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OAplikaciji oaplikaciji = new OAplikaciji();
            oaplikaciji.ShowDialog();
        }

        private void mnuUPdfUzOtvaranje_Click(object sender, EventArgs e)
        {
            openFile(exportUPdf());
        }

        private void mnuUExcelUzOtvaranje_Click(object sender, EventArgs e)
        {
            openFile(exportUExcel());
        }

        private void exportUzOtvaranjeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFile(strankaExportUExcel());
        }

        private void exportToolStripMenuItem_Click(object sender, EventArgs e)
        {
            strankaExportUExcel();
        }

        #endregion

        #region Methods

        private bool validacijaZaKreiranjeLista()
        {
            errNotifikacijaValidacije.Clear();

            if (string.IsNullOrEmpty(txtStranka.Text))
            {
                errNotifikacijaValidacije.SetError(txtStranka, "Naziv stranke je obvezan, molim Vas da ga unesete !");
                return false;
            }

            if (string.IsNullOrEmpty(txtMobitelStranke.Text))
            {
                errNotifikacijaValidacije.SetError(txtMobitelStranke, "Mobitel stranke je obvezan, molim Vas da ga unesete !");
                return false;
            }

            if (rbNAADresiKorisnika.Checked && string.IsNullOrEmpty(txtAdresaStranke.Text))
            {
                errNotifikacijaValidacije.SetError(txtAdresaStranke, "U slučaju zaprimanja kod stranke, adresa stranke je obvezna !");
                return false;
            }
            return true;
        }

        private bool validacijaZatvaranjaLista()
        {
            var uneseniOpisRada = txtOpisRada.Text;

            int vrijednostUtrosenogRada;

            if (!int.TryParse(mtxtUtrosenoSatiRada.Text, out vrijednostUtrosenogRada))
            {
                MessageBox.Show("Niste unijeli utrošeno vrijme !");
                return false;
            }

            if (string.IsNullOrEmpty(uneseniOpisRada))
            {
                MessageBox.Show("Niste unijeli opis rada !");
                return false;
            }
            return true;
        }

        private void omoguciKontroleZatvaranjaListica(bool omoguci)
        {
            btnDodajOpisRada.Enabled =
            gbOpisRadaMjesto.Enabled =
            btnZatvori.Enabled =
            mtxtUtrosenoSatiRada.Enabled =
            txtUtrosenMaterijalUnos.Enabled =
            dgUtrosenMaterijal.Enabled =
            cbUtrosenMaterijalBrojKomada.Enabled =
            txtOpisRada.Enabled = omoguci;
        }

        private void omoguciKontroleOtvaranjaListica(bool omoguci)
        {
            panelMjestoZaprimanja.Enabled =
            txtStranka.Enabled =
            txtStrankaOIB.Enabled =
            txtAdresaStranke.Enabled =
            txtTelefonStranke.Enabled =
            txtMobitelStranke.Enabled =
            txtEmailStranke.Enabled =
            btnKreirajList.Enabled =
            txtOpisOdabarnogOpisProblema.Enabled = omoguci;

            foreach (var item in listaKontrolaZaOpisRada)
            {
                item.Enabled = omoguci;
            }
        }

        private void ubaciPostojeciList(Core.List listZaPonovnoOtvaranje)
        {
            trenutniList = listZaPonovnoOtvaranje;
            lblBrojListica.Text = trenutniList.BrojLista;
            lblZaprimatelj.Text = generirajPrikazDjelatnika(trenutniList.ZaprimateljID);

            omoguciKontroleOtvaranjaListica(false);

            if (listZaPonovnoOtvaranje.DatumZatvaranja == null)
            {
                omoguciKontroleZatvaranjaListica(true);
                btnDodajPodatkeZaIsporuku.Enabled = false;
                resetirajKontroleZaZatvaranjeListica();
                lblServiserOdradio.Text = generirajPrikazDjelatnika(Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.ID);
            }
            else
            {
                omoguciKontroleZatvaranjaListica(false);
                btnDodajPodatkeZaIsporuku.Enabled = true;
                txtOpisRada.Text = trenutniList.OpisRada;
                lblServiserOdradio.Text = Korisnici.GeneriajPrikazKorisnika(trenutniList.Serviser);
                utrosenMaterijalBS.DataSource =
                (
                    from item in context.Materijals
                    join stavka in context.ListMaterijalStavkas
                    on item.ID equals stavka.MaterijalID
                    where stavka.BrojList == trenutniList.BrojLista
                    select new OdabraniUtrosenMaterijalStavkaVizual()
                    {
                        Materijal = item.Naziv,
                        BrojList = lblBrojListica.Text,
                        Komada = (int)stavka.Komada
                    }
                ).ToList();
            }

            
            rbUPnp.Checked = trenutniList.ZaprimljenoUPnp;
            rbNAADresiKorisnika.Checked = !trenutniList.ZaprimljenoUPnp;
            txtStranka.Text = trenutniList.Stranka.Naziv;
            lblDatumPrimitka.Text = trenutniList.DatumPrimitka.ToShortDateString();

            txtAdresaStranke.Text = trenutniList.Stranka.Adresa;
            txtStrankaOIB.Text = trenutniList.Stranka.OIB;
            txtTelefonStranke.Text = trenutniList.Stranka.BrojTelefona;
            txtMobitelStranke.Text = trenutniList.Stranka.BrojMobitela;
            txtEmailStranke.Text = trenutniList.Stranka.Email;
            txtOpisOdabarnogOpisProblema.Text = trenutniList.OpisProblema;

            foreach (var item in listaKontrolaZaOpisRada)
            {
                item.Checked = trenutniList.ListOpisProblemaStavkas.Where(clan => clan.OpisProblemaID == (long)item.Tag).Count() > 0;
            }

            mtxtUtrosenoSatiRada.Text = trenutniList.UtrosenoVrijemeRada.ToString();

            rbOpisUServisu.Checked = trenutniList.OpisRadaRadUServisu;
            rbOpisRadaNaTerenu.Checked = !trenutniList.OpisRadaRadUServisu;

            btnDodajOpisRada.Focus();

            omoguciExport(true);
        }

        private void resetirajKontroleZaZatvaranjeListica()
        {
            mtxtUtrosenoSatiRada.Text = "";
            txtOpisRada.Text = "";
            cbUtrosenMaterijalBrojKomada.SelectedIndex = 0;
            rbOpisUServisu.Checked = true;
            txtUtrosenMaterijalUnos.Text = "";
            utrosenMaterijalBS.DataSource = new List<Core.OdabraniUtrosenMaterijalStavkaVizual>();
        }

        private string generirajPrikazDjelatnika(long zaprimateljID)
        {
            Djelatnik dje = (from item in context.Djelatniks where item.ID == zaprimateljID select item).FirstOrDefault();
            return dje.Ime + " " + dje.Prezime + " - " + dje.Simbol;
        }

        private void omoguciExport(bool omoguceno)
        {
            this.mnuUPdf.Enabled =
            this.mnuUPdfUzOtvaranje.Enabled =
            this.mnuUExcelUzOtvaranje.Enabled =
            this.mnuUExcel.Enabled = omoguceno;
        }

        private void postaviPodatkeZaNoviLsit()
        {
            omoguciKontroleOtvaranjaListica(true);
            omoguciKontroleZatvaranjaListica(false);
            resetirajKontroleOtvaranjaListica();

            txtStranka.AutoCompleteCustomSource = strankaDpounjavanje;
            txtStranka.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtStranka.AutoCompleteSource = AutoCompleteSource.CustomSource;

            txtStrankaOIB.AutoCompleteCustomSource = strankaOIBDpounjavanje;
            txtStrankaOIB.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtStrankaOIB.AutoCompleteSource = AutoCompleteSource.CustomSource;

            txtUtrosenMaterijalUnos.AutoCompleteCustomSource = materijaliDpounjavanje;
            txtUtrosenMaterijalUnos.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtUtrosenMaterijalUnos.AutoCompleteSource = AutoCompleteSource.CustomSource;

            lblZaprimatelj.Text = Rukovatelji.Korisnici.GetInstance().GeneriajPrikazKorisnika();
            trenutniList = new List();
            trenutniList.ZaprimateljID = Rukovatelji.Korisnici.GetInstance().TreutnoUlogiraniDjelatnik.ID;
            trenutniList.BrojLista = lblBrojListica.Text = Rukovatelji.TrenutniList.GetInstance().GenerirajNoviBrojListica();
            trenutniList.DatumPrimitka = DateTime.Now;
            trenutniList.OpisRadaRadUServisu = true;
            rbOpisUServisu.Checked = true;
            lblServiserOdradio.Text = "";
            lblDatumPrimitka.Text = trenutniList.DatumPrimitka.ToShortDateString();

            cbUtrosenMaterijalBrojKomada.Items.Clear();
            for (int i = 1; i < 51; i++)
            {
                cbUtrosenMaterijalBrojKomada.Items.Add(i);
            }
            cbUtrosenMaterijalBrojKomada.SelectedIndex = 0;

            utrosenMaterijalBS.DataSource = new List<Core.OdabraniUtrosenMaterijalStavkaVizual>();

            var stranke = (from str in context.Strankas select str.Naziv).ToList();
            foreach (string item in stranke)
            {
                strankaDpounjavanje.Add(item);
            }
            var oibi = (from str in context.Strankas select str.OIB).ToList();
            foreach (string item in oibi)
            {
                strankaOIBDpounjavanje.Add(item);
            }

            var materijali = (from str in context.Materijals select str.Naziv).ToList();
            foreach (var item in materijali)
            {
                materijaliDpounjavanje.Add(item);
            }

            opisProblemaBindingSource.DataSource = (from item in context.OpisProblemas select item).ToList();

            mtxtUtrosenoSatiRada.Text = "";

            btnDodajPodatkeZaIsporuku.Enabled = false;

            omoguciExport(false);

            panelMjestoZaprimanja.Focus();
        }

        private void resetirajKontroleOtvaranjaListica()
        {
            txtStranka.Text = "";
            txtAdresaStranke.Text = "";
            txtTelefonStranke.Text = "";
            txtMobitelStranke.Text = "";
            txtEmailStranke.Text = "";
            txtStrankaOIB.Text = "";
            foreach (CheckBox item in listaKontrolaZaOpisRada)
            {
                item.Checked = false;
            }
            txtOpisOdabarnogOpisProblema.Text = "";
            txtOpisRada.Text = "";
            mtxtUtrosenoSatiRada.Text = "";
            txtUtrosenMaterijalUnos.Text = "";
        }

        private string exportUPdf()
        {
            string path = "";
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                path = folderBrowserDialog.SelectedPath;
            }

            path = Path.Combine(path, trenutniList.BrojLista + ".pdf");
            ExportServisnogListaUPdfAdapter.Export(trenutniList, path);
            return path;
        }

        private string exportUExcel()
        {
            string path = "";
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                path = folderBrowserDialog.SelectedPath;
            }

            path = Path.Combine(path, trenutniList.BrojLista + ".xlsx");

            ExportServisnogListaUExcelAdapter.Export(trenutniList, path);

            return path;
        }

        private void openFile(string path)
        {
            if (File.Exists(path))
            {
                ProcessStartInfo pi = new ProcessStartInfo(path);
                Process.Start(path);
            }
        }

        private string strankaExportUExcel()
        {
            string path = "";
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                path = folderBrowserDialog.SelectedPath;
            }

            path = Path.Combine(path, "stranke.xlsx");

            ExportStranakaUExcelAdapter.Export(context, path);

            return path;
        }

        private void generirajKontroleZaOdabirOpisaProblema()
        {
            listaKontrolaZaOpisRada.Clear();
            var opisiProblema = context.OpisProblemas.ToList();
            int width = 14;
            foreach (var item in opisiProblema)
            {
                CheckBox noviBox = new CheckBox();
                noviBox.Tag = item.ID;
                noviBox.Name = item.ID.ToString();
                noviBox.Text = item.Naziv;
                noviBox.Location = new Point(width, 214);
                noviBox.Width = 70;
                noviBox.TabIndex = 7;
                width += 72;
                listaKontrolaZaOpisRada.Add(noviBox);
            }
            this.Controls.AddRange(listaKontrolaZaOpisRada.ToArray());
        }

        #endregion
    }

}
